#ifndef __MYSTRING__
#define __MYSTRING__

#include <cstring>
#include <iostream>
using namespace std;


class String {
public:
    // 构造函数
    String (const char* cstr = 0);
    // 拷贝构造函数
    String (const String& str);
    // 拷贝赋值函数
    String& operator = (const String& str);
    // 析构函数
    ~String ();
    // 辅助输出函数
    char* get_c_str() const { return data_; }

private:
    char* data_;
};


inline String::String(const char* cstr) {
    std::cout << "调用构造函数" << std::endl;
    if(cstr) {
        data_ = new char[strlen(cstr) + 1];
        strcpy(data_, cstr);
    }
    else { // 兼顾没有指定初始值的对象声明
        std::cout << "cstr = null;" << std::endl;
        data_ = new char[1];
        *data_ = '/0';
    }
}

inline String::String(const String& str) {
    std::cout << "调用拷贝构造函数" << std::endl;
    data_ = new char[strlen(str.data_) + 1];
    strcpy(data_,str.data_);
}

inline String& String::operator=(const String& str) {
    std::cout << "调用拷贝赋值函数" << std::endl;
    // 避免自赋值
    if (this == &str) {
        return *this;
    }
    else {
        delete data_;
        data_ = new char[strlen(str.data_) + 1];
        strcpy(data_,str.data_);
    }
}

inline String::~String() {
    std::cout << "调用析构函数" << std::endl;
    delete[] data_;
}

std::ostream& operator << (std::ostream& os, const String& str) {
    os << str.get_c_str();
    return os;
}

#endif